package keggacces;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import kegg.Pathway;

/**
 * @file Descarga.java
 * @author Juan Humanes Ferrer
 * @date 04-Marzo-2014
 * @description Clase encargada de acceder a Kegg para parsear los xml y crear
 * los ficheros .sif y .txt
 */
public class Descarga {

    /**
     * Método encargado de parsear los ficheros xml del organismo pasado por
     * parámetro y los guardará en objetos de tipo pathway con el fin de
     * compararlos con una red de genes
     *
     * @param org
     * @return ps Lista de pathways
     * @throws IOException
     */
    public static List<Pathway> descargaOrganismo(String org) throws IOException {

        List<String> lista = new ArrayList();

        try {

            URL url = new URL("http://rest.kegg.jp/list/pathway/" + org);

            // establecemos conexion
            URLConnection urlCon = url.openConnection();

            InputStream is = null;
            // local.
            try {
                is = urlCon.getInputStream();
            } catch (IOException ex) {
            }
            if (is != null) {

                String result = getStringFromInputStream(is);
                String[] ids = result.split("path:");

                for (int i = 1; i < ids.length; i++) {

                    lista.add(ids[i].substring(0, 8));
                }

            }

        } catch (IOException e) {
        }

        String kgml;
        List<Pathway> ps = new ArrayList();

        for (String lista1 : lista) {
            kgml = lista1;
            Pathway p = ParserKGML.parseoXML(kgml);
            if (p.getTitle() != null) {
                ps.add(p);
            }

        }
        return ps;

    }

    /**
     * Método encargado de parsear los ficheros xml del organismo pasado por
     * parámetro y los guardará en objetos de tipo pathway con el fin de
     * realizar un analisis de entiquecimiento
     *
     * @param org
     * @return ps Lista de pathways
     * @throws IOException
     */
    public static List<Pathway> descargaOrganismoEnrich(String org) throws IOException {

        List<String> lista = new ArrayList();

        try {

            URL url = new URL("http://rest.kegg.jp/list/pathway/" + org);

            // establecemos conexion
            URLConnection urlCon = url.openConnection();

            InputStream is = null;
            // local.
            try {
                is = urlCon.getInputStream();
            } catch (IOException ex) {
            }
            if (is != null) {

                String result = getStringFromInputStream(is);
                String[] ids = result.split("path:");

                for (int i = 1; i < ids.length; i++) {

                    lista.add(ids[i].substring(0, 8));
                }

            }

        } catch (IOException e) {
        }

        String kgml;
        List<Pathway> ps = new ArrayList();

        for (String lista1 : lista) {
            kgml = lista1;
            Pathway p = ParserKGML.parseoXMLEnrich(kgml);
            if (p.getTitle() != null) {
                ps.add(p);
            }

        }
        return ps;

    }

    /**
     * convert InputStream to String
     *
     * @param is
     * @return sb.toString()
     * @throws IOException
     */
    private static String getStringFromInputStream(InputStream is) {

        BufferedReader br = null;
        StringBuilder sb = new StringBuilder();

        String line;
        try {

            br = new BufferedReader(new InputStreamReader(is));
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

        } catch (IOException e) {
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                }
            }
        }

        return sb.toString();

    }
}
